﻿using System;
using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis;
using System.Linq;
using System.Security.Principal;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;
using System.Web.Security;
using Venta_Automatica.Models;
using Venta_Automatica.wsUsuario;


namespace Venta_Automatica.Controllers
{

    [HandleError]
    public class AccountController : Controller
    {

        public IFormsAuthenticationService FormsService { get; set; }
        public IMembershipService MembershipService { get; set; }

        protected override void Initialize(RequestContext requestContext)
        {
            if (FormsService == null) { FormsService = new FormsAuthenticationService(); }
            if (MembershipService == null) { MembershipService = new AccountMembershipService(); }

            base.Initialize(requestContext);
        }



        // **************************************
        // URL: /Account/LogOn
        // **************************************

        public ActionResult LogOn()
        {
            return View();
        }

        [HttpPost]
        public ActionResult LogOn(LogOnModel model, string returnUrl)
        {
            try
            {
                if (ModelState.IsValid)
                {
                    int idRol = MembershipService.ValidateUser(model.UserName, model.Password);
                    if (idRol > 0)
                    {
                        FormsService.SignIn(model.UserName + "|" + idRol.ToString(), model.RememberMe);

                        if (!String.IsNullOrEmpty(returnUrl))
                        {
                            return Redirect(returnUrl);
                        }
                        else
                        {
                            return RedirectToAction("Index", "Home");
                        }
                    }
                    else
                    {
                        ModelState.AddModelError( "" , "El nombre de usuario o la contraseña especificados son incorrectos.");
                    }
                }
            }
            catch (System.ServiceModel.FaultException<ValidationException> ex)
            {
                ModelState.AddModelError("", ex.Detail.ValidationError);
            }

            // Si llegamos a este punto, es que se ha producido un error y volvemos a mostrar el formulario
            return View(model);
        }

        // **************************************
        // URL: /Account/LogOff
        // **************************************

        public ActionResult LogOff()
        {
            FormsService.SignOut();

            return RedirectToAction("Index", "Home");
        }

        // **************************************
        // URL: /Account/Register
        // **************************************

        public ActionResult Register()
        {
            ViewData["PasswordLength"] = MembershipService.MinPasswordLength;
            return View();
        }

        
        public ActionResult RegistrarUsuario()
        {
            return View();
        }

        [HttpPost]
        public ActionResult RegistrarUsuario(ListarUsuarioModel usuarioModel)
        {
            ViewData["PasswordLength"] = MembershipService.MinPasswordLength;

            if (ModelState.IsValid)
            {
                wsUsuario.UsuariosClient proxy = new wsUsuario.UsuariosClient();

                try
                {
                    usuarioModel.id = 0;
                    proxy.CrearUsuarios(usuarioModel.id, usuarioModel.dni, usuarioModel.nombre, usuarioModel.email, usuarioModel.password, usuarioModel.mensaje,usuarioModel.idRol);
                    ViewData["Message"] = "Los Datos del Usuario se Registraron Correctamente.";
                }
                catch (System.ServiceModel.FaultException<ValidationException> ex)
                {
                    ModelState.AddModelError("", ex.Detail.ValidationError);
                }
                                
                return View();
            }
            else
            {
                ModelState.AddModelError("", "Los datos ingresados no son correctos, verifique e intente nuevamente.");
            }
            return View(usuarioModel);
        }

        [HttpPost]
        public ActionResult Register(RegistrarUsuario model)
        {
            if (ModelState.IsValid)
            {
                // Intento de registrar al usuario
                MembershipCreateStatus createStatus = MembershipService.CreateUser(model.UserName, model.Password, model.Email);

                if (createStatus == MembershipCreateStatus.Success)
                {
                    FormsService.SignIn(model.UserName, false /* createPersistentCookie */);
                    return RedirectToAction("Index", "Home");
                }
                else
                {
                    ModelState.AddModelError("", AccountValidation.ErrorCodeToString(createStatus));
                }
            }

            // Si llegamos a este punto, es que se ha producido un error y volvemos a mostrar el formulario
            ViewData["PasswordLength"] = MembershipService.MinPasswordLength;
            return View(model);
        }

        // **************************************
        // URL: /Account/ChangePassword
        // **************************************

        [Authorize]
        public ActionResult ChangePassword()
        {
            ViewData["PasswordLength"] = MembershipService.MinPasswordLength;
            return View();
        }

        [Authorize]
        [HttpPost]
        public ActionResult ChangePassword(ChangePasswordModel model)
        {
            if (ModelState.IsValid)
            {
                if (MembershipService.ChangePassword(User.Identity.Name, model.OldPassword, model.NewPassword))
                {
                    return RedirectToAction("ChangePasswordSuccess");
                }
                else
                {
                    ModelState.AddModelError("", "La contraseña actual es incorrecta o la nueva contraseña no es válida.");
                }
            }

            // Si llegamos a este punto, es que se ha producido un error y volvemos a mostrar el formulario
            ViewData["PasswordLength"] = MembershipService.MinPasswordLength;
            return View(model);
        }

        // **************************************
        // URL: /Account/ChangePasswordSuccess
        // **************************************

        public ActionResult ChangePasswordSuccess(ChangePasswordModel model)
        {
            return View();
        }

        [HttpPost]
        public ActionResult EliminarUsuario(ListarUsuarioModel usuarioModel)
        {
                wsUsuario.UsuariosClient proxy = new wsUsuario.UsuariosClient(); 
                proxy.EliminarUsuario(usuarioModel.id);
                ViewData["Message"] = "El registro se elimino Correctamente.";
                return View(usuarioModel);
        }

        public ActionResult EliminarUsuario(int id)
        {
            wsUsuario.UsuariosClient proxy = new wsUsuario.UsuariosClient();
            wsUsuario.Usuario resultado = proxy.ObtenerUsuario(id);
            
            List<Usuario> usuarioList = proxy.ListarUsuario().ToList();
            ListarUsuarioModel usuarioModel = new ListarUsuarioModel(); ;

                    usuarioModel.id = resultado.id;
                    usuarioModel.dni = resultado.dni;
                    usuarioModel.nombre = resultado.nombre;
                    usuarioModel.email = resultado.email;
                    usuarioModel.mensaje = resultado.mensaje;
                    usuarioModel.idRol = resultado.idRol;
             return View(usuarioModel);
        }

       // [HttpPost]
        public ActionResult ListarUsuarios()
        {
            wsUsuario.UsuariosClient proxy = new wsUsuario.UsuariosClient();
            List<Usuario> usuarioList = proxy.ListarUsuario().ToList();

            ListarUsuarioModel usuarioModel;

            List<ListarUsuarioModel> listaUsuarioModel = new List<ListarUsuarioModel>();
            foreach (var item in usuarioList)
            {
                usuarioModel = new ListarUsuarioModel();
                usuarioModel.id = item.id;
                usuarioModel.dni = item.dni;
                usuarioModel.email = item.email;
                usuarioModel.nombre = item.nombre;
                usuarioModel.password = item.password;
                usuarioModel.mensaje = item.mensaje;
                usuarioModel.idRol = item.idRol;
                listaUsuarioModel.Add(usuarioModel);
            }


            return View(listaUsuarioModel);
        }

        public ActionResult DetalleUsuario(int id)
        {
            wsUsuario.UsuariosClient proxy = new wsUsuario.UsuariosClient();
            Usuario usuarioList = proxy.ObtenerUsuario(id);

            ListarUsuarioModel usuarioModel = new ListarUsuarioModel(); ;
            usuarioModel.id = usuarioList.id;
            usuarioModel.dni = usuarioList.dni;
            usuarioModel.nombre = usuarioList.nombre;
            usuarioModel.email = usuarioList.email;
            usuarioModel.mensaje = usuarioList.mensaje;
            usuarioModel.idRol = usuarioList.idRol;

            return View(usuarioModel);
        }

        public ActionResult ModificarUsuario(int id)
        {
            wsUsuario.UsuariosClient proxy = new wsUsuario.UsuariosClient();
            Usuario usuarioList = proxy.ObtenerUsuario(id);

            ListarUsuarioModel usuarioModel = new ListarUsuarioModel(); ;
            usuarioModel.id = usuarioList.id;
            usuarioModel.dni = usuarioList.dni;
            usuarioModel.nombre = usuarioList.nombre;
            usuarioModel.email = usuarioList.email;
            usuarioModel.mensaje = usuarioList.mensaje;
            usuarioModel.idRol = usuarioList.idRol;

            return View(usuarioModel);
        }

        [HttpPost]
        public ActionResult ModificarUsuario(ListarUsuarioModel usuarioModel)
        {
            if (ModelState.IsValid)
            {
                ViewData["Message"] = "Los Datos del Usuario se Actualizaron Correctamente.";

                wsUsuario.UsuariosClient proxy = new wsUsuario.UsuariosClient();
                proxy.ModificarUsuario(usuarioModel.id,usuarioModel.dni, usuarioModel.email, usuarioModel.mensaje, usuarioModel.nombre, usuarioModel.password, usuarioModel.idRol);

                return View();
            }
            else
            {
                ModelState.AddModelError("", "Los datos ingresados no son correctos, verifique e intente nuevamente.");
            }
            return View(usuarioModel);
        }



    }
}
